home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -serious- / programming / other / littelcomp / r5 / lc / fdtool.e < prev    next >
Text File  |  2000-02-28  |  5KB  |  189 lines

  1. -> AUTHOR : Leif_Salomonsson@swipnet.se
  2. -> STATUS : FREEWARE
  3.  
  4. -> this little proggy takes a fd file with
  5. -> all the functions listed and turns it into
  6. -> autodoc format.
  7. -> added possibility to create LITTEL macro functions.
  8.  
  9.  
  10. MODULE '*extractwords'
  11. MODULE 'afc/parser'
  12.  
  13. MODULE 'dos/dos'
  14.  
  15.  
  16.    DEF p=NIL:PTR TO parser
  17.    DEF ew=NIL:PTR TO extractwords
  18.    DEF fh2=NIL
  19.  
  20. PROC main() HANDLE
  21.    DEF fh=NIL
  22.    DEF flen=NIL
  23.    DEF buf[25000]:ARRAY OF CHAR
  24.    DEF end
  25.  
  26.    NEW p.parser()
  27.    IF p.parse('INFILE/A,NAME/A,OUTFILE/A,TARGET/A', arg)=NIL THEN Raise("ARG")
  28.  
  29.    flen := FileLength(p.arg(0))
  30.    IF flen < 1 THEN Raise("INFI")
  31.    NEW ew.new(1, 500)
  32.    fh := Open(p.arg(0), MODE_OLDFILE)
  33.    Read(fh, buf, flen)
  34.    fh2 := Open(p.arg(2), MODE_NEWFILE)
  35.    end := buf + flen
  36.    IF StrCmp(p.arg(3), 'AD') = TRUE
  37.      bla1(buf, end, fh2)
  38.      bla2(buf, end, fh2)
  39.    ELSEIF StrCmp(p.arg(3), 'MF')=TRUE
  40.      makeMacroFunctions(buf, end, fh2)
  41.    ELSEIF StrCmp(p.arg(3), 'E')=TRUE
  42.      WriteF('TARGET not implemented yet!\n')
  43.    ELSE
  44.      WriteF('TARGET unknown!\n')
  45.    ENDIF
  46. EXCEPT DO
  47.    SELECT exception
  48.    CASE "INFI" ; WriteF('Cant open INFILE!\n')
  49.    CASE "ARG" ; WriteF('Please give me some/right arguments!')
  50.    ENDSELECT
  51.    IF fh THEN Close(fh)
  52.    IF fh2 THEN Close(fh2)
  53. ENDPROC
  54.  
  55. PROC bla1(buf, end, fh2)
  56.    DEF str[100]:STRING
  57.    DEF tstr[100]:STRING
  58.    DEF private=FALSE
  59.    write('TABLE OF CONTENTS\n\n')
  60.    WHILE buf <> end
  61.       ew.extract(buf)
  62.       IF StrCmp(buf, '##', 2) = FALSE
  63.       IF private = FALSE
  64.       IF StrCmp(buf, '*', 1) = FALSE
  65.         StrCopy(tstr, ew.getWord(0), InStr(ew.getWord(0), '('))
  66.         StringF(str, '\s/\s\n', p.arg(1), tstr)
  67.         write(str)
  68.       ENDIF
  69.       ENDIF
  70.       ELSE
  71.          IF StrCmp(buf, '##private', 9) = TRUE THEN private := TRUE
  72.          IF StrCmp(buf, '##public', 8) = TRUE THEN private := FALSE
  73.       ENDIF
  74.       buf := nextLine(buf)
  75.    ENDWHILE
  76.    write('\n\n')
  77. ENDPROC
  78.  
  79. PROC bla2(buf, end, fh2)
  80.    DEF str[100]:STRING
  81.    DEF tstr[100]:STRING
  82.    DEF private=FALSE
  83.    WHILE buf <> end
  84.       ew.extract(buf)
  85.       IF StrCmp(buf, '##', 2) = FALSE
  86.       IF private = FALSE
  87.       IF StrCmp(buf, '*', 1) = FALSE
  88.          StrCopy(tstr, ew.getWord(0), InStr(ew.getWord(0), '('))
  89.          StringF(str, '\c\s/\s\n\n', 12, p.arg(1), tstr)
  90.          write(str)
  91.          StringF(str, '        NAME\n           \s -\n', tstr)
  92.          write(str)
  93.          StringF(str, '        SYNOPSIS\n           \s\n', ew.getWord(0))
  94.          write(str)
  95.          write('        FUNCTION\n')
  96.          write('        INPUTS\n')
  97.          write('        RESULTS\n')
  98.          write('        EXAMPLE\n')
  99.          write('        NOTES\n')
  100.          write('        BUGS\n')
  101.          write('        SEE ALSO\n')
  102.          write('\n')
  103.       ENDIF
  104.       ENDIF
  105.       ELSE
  106.          IF StrCmp(buf, '##private', 9) = TRUE THEN private := TRUE
  107.          IF StrCmp(buf, '##public', 8) = TRUE THEN private := FALSE
  108.       ENDIF
  109.       buf := nextLine(buf)
  110.    ENDWHILE
  111. ENDPROC
  112.  
  113. PROC makeMacroFunctions(buf, end, fh2)
  114.    DEF str[200]:STRING
  115.    DEF nstr[100]:STRING
  116.    DEF rstr[200]:STRING
  117.    DEF private=FALSE
  118.    DEF basestr[50]:STRING
  119.    DEF r
  120.    DEF bias
  121.  
  122.   -> ew.extract(buf)
  123.    StrCopy(basestr, 'unknownBase')
  124.  
  125.    WHILE buf <> end
  126.       ew.extract(buf)
  127.       IF StrCmp(buf, '##bias', 6) = TRUE THEN bias := -Val(buf+6)
  128.       IF StrCmp(buf, '##base', 6) = TRUE THEN StrCopy(basestr, ew.getWord(1))
  129.     IF StrCmp(buf, '##', 2) = FALSE
  130.      IF StrCmp(buf, '*', 1) = FALSE
  131.       IF private = FALSE
  132.       StrCopy(nstr, ew.getWord(0), InStr(ew.getWord(0), '('))
  133.       StrCopy(rstr, ew.getWord(0) + InStr(ew.getWord(0), ')(') + 2)
  134.       SetStr(rstr, EstrLen(rstr)-1)
  135.       StringF(str, '   macro x\s\n', nstr)
  136.       write(str)
  137.  
  138.       r := rstr
  139.       r := bla(r)
  140.       r := bla(r)
  141.       r := bla(r)
  142.       r := bla(r)
  143.       r := bla(r)
  144.       r := bla(r)
  145.       r := bla(r)
  146.       r := bla(r)
  147.       r := bla(r)
  148.       r := bla(r)
  149.       r := bla(r)
  150.  
  151.       StringF(str, '      move.l \s(a4), a6\n', basestr)
  152.       write(str)
  153.       StringF(str, '      jsr \d(a6)\n', bias, nstr)
  154.       write(str)
  155.  
  156.       write('   endm\n')
  157.       ENDIF
  158.       bias := bias - 6
  159.      ENDIF
  160.     ELSE
  161.        IF StrCmp(buf, '##private', 9) = TRUE THEN private := TRUE
  162.        IF StrCmp(buf, '##public', 8) = TRUE THEN private := FALSE
  163.     ENDIF
  164.       buf := nextLine(buf)
  165.    ENDWHILE
  166. ENDPROC
  167.  
  168. PROC bla(rstr)
  169.    DEF str[100]:STRING
  170.    IF StrLen(rstr) > 0
  171.       StringF(str, '      move.l (a7)+, \s[2]\n', rstr)
  172.       write(str)
  173.       rstr := rstr + 3
  174.    ENDIF
  175. ENDPROC rstr
  176.  
  177. PROC write(str) IS Write(fh2, str, StrLen(str))
  178.  
  179. /* borrowing function frpm lc17.e */
  180. PROC nextLine(str:PTR TO CHAR)
  181.    WHILE str[] <> 10 DO str++
  182.    ->linenum++
  183.    str++
  184.    WHILE str[] = 10
  185.       str++
  186.       ->linenum++
  187.    ENDWHILE
  188. ENDPROC str
  189.